<?php

/**
 * @Author: tianwangchong
 * @Date:   2018-06-04 18:48:36
 * @Last Modified by:   tianwangchong
 * @Last Modified time: 2018-06-05 11:58:48
 */

namespace App\Classes\WechatRobot;

use App\Handlers\Contact\ColleagueGroup;
use App\Handlers\Contact\ExperienceGroup;
use App\Handlers\Contact\FeedbackGroup;
use App\Handlers\Contact\Tian;
use App\Handlers\Type\RecallType;
use App\Handlers\Type\TextType;
use Hanson\Vbot\Contact\Friends;
use Hanson\Vbot\Contact\Groups;
use Hanson\Vbot\Contact\Members;
use Hanson\Vbot\Message\Emoticon;
use Hanson\Vbot\Message\Text;
use Illuminate\Support\Collection;

class MessageHandler
{
    public static function messageHandler(Collection $message)
    {
        /** @var Friends $friends */
        // 好友实例
        $friends = vbot('friends');

        /** @var Members $members */
        // 群实例
        $members = vbot('members');

        /** @var Groups $groups */
        // 群成员实例
        $groups = vbot('groups');

        // 公众号实例
        $officials = vbot('officials');

        // 特殊账号实例
        $specials = vbot('specials');

        // 获取自己实例
        $myself = vbot('myself');

        /**
         * API
         */
        // 通用注解
        // $blur 是否模糊搜索
        // 通用API
        // 这里指每个实例都能调用的通用方法，下面用 $friends 作为范例

        // 根据昵称获取对象
        // $friends->getUsernameByNickname($nickname, $blur = false);

        // 根据备注获取对象
        // $friends->getUsernameByRemarkName($remark, $blur = false);

        // 搜索出 UserName
        // search 为搜索的词，key 为要搜索的键
        // $friends->getUsername($search, $key, $blur = false);

        // 搜索出 联系人
        // search 为搜索的词，key 为要搜索的键
        // $friends->getUsername($search, $key, $blur = false);

        // 根据 UserName 获取联系人
        // 当你无法得知该 username 所属时可使用
        // $friends->getAccount($username);
        // 一般建议根据类型选择，如
        // $groups->get($username);

        // 获取头像
        // $data = $groups->getAvatar($username);
        // file_put_content('avatar.jpg', $data);

        /**
         * 好友 API
         */
        // 设置备注
        // $friends->setRemarkName($username, $remarkName);

        // 设置备注
        // $isStick 为 true 为置顶，否则相反
        // $friends->setStick($username, $isStick = true);

        // 添加好友
        // 仅能根据 username 添加好友，换言之，只能添加群成员为好友，content 为添加好友申请说明
        // $friends->add($username, $content = null);

        // 同意添加好友
        // $message 为 message handler 接收到的 friend_request 消息，直接扔进来此处即可
        // $friends->approve($message);

        /**
         * 群 API
         */
        // 根据昵称获取群联系人
        // 等同于 $groups->getObject($nickname, 'NickName', $blur);
        // $groups->getGroupsByNickname($nickname, $blur = false);

        // 根据昵称搜索群成员
        // $groups->getMembersByNickname($groupUsername, $memberNickname, $blur = false)

        // 创建群聊天
        // 联系人的 username 数组
        // $groups->create(array $contacts)

        // 删除群成员
        // 移除群成员， $members 可以为单个 username 或者 数组
        // $groups->deleteMember($groupUsername, $members)

        // 增加群成员
        // $groups->addMember($groupUsername, $members)

        // 设置群名称
        // $groups->setGroupName($group, $name)

        /**
         * 消息
         */
        // 基础属性
        // 参数  类型  描述
        // type    string  消息类型（每种消息都对应一个 type 类型）
        // username    string  发送者的 Username，当为群消息时此值为 sender 的 username
        // from    array   消息来源
        // sender  array   群消息发送者
        // content string  经过处理显示在控制台的消息
        // message string  转格式后的消息
        // time    Carbon  发送时间
        // fromType    string  消息发送者类型
        // raw array   消息原始数据（完全不经处理的原始数据）

        // message vs content vs raw ?
        // raw. 是微信返回的原始数据，其中夹杂着大量无用的数据， Vbot 在处理 raw 时会取出有用的数据作为消息的属性
        // message. message 是经过 raw 处理而来的，例如对
        // 标签、XML 的转移
        // content. content 是为了处理不便于在控制台展示的数据。如 [表情] [视频] [分享] 等等

        // fromType
        // 消息发送者的类型
        // System 系统消息
        // Self 自己发送的消息
        // Group 群组消息
        // Friend 联系人消息
        // Official 公众号消息
        // Special 特殊账号消息
        // Unknown 未知消息

        // from & sender
        // 这个结构可参考 好友 以及 群成员

        // 如何获取属性值？
        // 举例：
        // 消息类型： $message['type']
        // 消息来源昵称： $message['from']['NickName'] (更多详情可查阅 联系人)

        Tian::messageHandler($message, $friends, $groups);
        ColleagueGroup::messageHandler($message, $friends, $groups);
        FeedbackGroup::messageHandler($message, $friends, $groups);
        ExperienceGroup::messageHandler($message, $friends, $groups);

        TextType::messageHandler($message, $friends, $groups);
        RecallType::messageHandler($message);

        // 新朋友
        if ($message['type'] === 'new_friend') {
            Text::send($message['from']['UserName'], '客官，等你很久了！');

            // 根据昵称获取对象
            $groups->addMember($groups->getUsernameByNickname('田大爷测试群'), $message['from']['UserName']);

            Text::send($message['from']['UserName'], '田大爷测试群，进去后为了避免轰炸记得设置免骚扰哦！如果被不小心踢出群，跟我说声“拉我”我就会拉你进群的了。');
        }

        // 表情
        // if ($message['type'] === 'emoticon' && random_int(0, 1)) {
        //     Emoticon::sendRandom($message['from']['UserName']);
        // }

        // @todo
        if ($message['type'] === 'official') {
            vbot('console')->log('收到公众号消息:' . $message['title'] . $message['description'] .
                $message['app'] . $message['url']);
        }

        // 收到好友申请
        if ($message['type'] === 'request_friend') {
            vbot('console')->log('收到好友申请:' . $message['info']['Content'] . $message['avatar']);
            if (in_array($message['info']['Content'], ['echo', 'print_r', 'var_dump', 'print'])) {
                $friends->approve($message);
            }
        }
    }
}
